package com.boarsoft.flow.store;

import java.util.List;

import com.boarsoft.common.dao.PagedResult;
import com.boarsoft.flow.core.SimpleFlow;

/**
 * 正反交易流程的保存接口
 * 
 * @author Mac_J
 *
 */
public interface SimpleFlowPersister {
	public static final int ERROR_EXISTS = 1;

	/**
	 * 保存流程实例。未执行保存动作时返回false<br>
	 * 保存失败则抛出异常
	 * 
	 * @return
	 */
	void save(SimpleFlow o);

	/**
	 * 更新流程实例状态。未执行保存动作时返回false<br>
	 * 保存失败则抛出异常
	 * 
	 * @param o
	 * @return
	 */
	boolean update(SimpleFlow o);

	/**
	 * 1、查询超时未冲正的正交易（无论是否批量冲正的情况）<br>
	 * 2、查询状态为失败且未冲正的正交易（只能是批量冲正的情况）<br>
	 * 3、查询冲正失败但未达到冲正次数上限的正交易
	 * 
	 * @param revMax1
	 *            情形1记录查询上限
	 * @param revMax2
	 *            情形2记录查询上限
	 * @param revMax3
	 *            情形3记录查询上限
	 * @return
	 */
	List<SimpleFlow> list(int revMax1, int revMax2, int revMax3);

	/**
	 * 从持久化存储中读取挂起的流程
	 * 
	 * @param flowId
	 * @param exeId
	 * @return
	 */
	SimpleFlow load(String flowId, String exeId);

	/**
	 * 删除流程（实例）
	 * 
	 * @param flow
	 */
	void delete(SimpleFlow flow);

	/**
	 * 删除流程（实例）
	 * 
	 * @param flowId
	 * @param exeId
	 * @return
	 */
	SimpleFlow remove(String flowId, String exeId);

	/**
	 * 分页查询流程（实例）
	 * 
	 * @param flowId
	 * @param key
	 * @param pageNo
	 * @param pageSize
	 * @return
	 */
	PagedResult<SimpleFlow> list(String flowId, String key, int pageNo, int pageSize);
}
